#ifndef __EVENTLOOP_HPP__
#define __EVENTLOOP_HPP__

#include "MutexLock.hpp"
#include <sys/epoll.h>
#include <vector>
#include <map>
#include <functional>
#include <memory>

using namespace std;

class Acceptor;
class TcpConnection;

using TcpConnectionPtr = shared_ptr<TcpConnection>;

class EventLoop {
    typedef function<void()> Functor;
    typedef vector<struct epoll_event> EventList;
    typedef map<int, TcpConnectionPtr> ConnectionMap;
    typedef TcpConnection::TcpConnectionCallback EpollCallback;
public:
    EventLoop(int listenfd); // Constructor
    ~EventLoop(); // Destructor
    void loop(); // 执行事件循环
    void unloop(); // 退出事件循环
    void runInLoop(const Functor& cb); // 向IO线程发送数据
    void wakeup(); // 激活_eventfd(执行写操作)
    void handleRead(); // 处理_eventfd(执行读操作)
    void doPendingFunctors(); // 执行回调函数
    void setConnectionCallback(EpollCallback cb); // 设置回调函数
    void setMessageCallback(EpollCallback cb); // 设置回调函数
    void setCloseCallback(EpollCallback cb); // 设置回调函数
    void waitEpollfd(); // 执行事件循环，由loop调用
    void handleConnection(); // 处理新连接
    void handleMessage(int peerfd); // 处理旧连接(信息)
private:
    int _epollfd; // Epoll实例的文件描述符
    int _eventfd; // eventfd, 用于线程之间的通信
    int _listenfd; // 服务器监听文件描述符
    bool isLooping; // 标记是否进行循环   
    EventList _eventList; // 存储触发事件的fd    
    ConnectionMap _connMap; // 保存所有已建立的连接   
    EpollCallback _onConnectionCb; // 回调函数，传递给TcpConnection对象
    EpollCallback _onMessageCb; // 回调函数，传递给TcpConnection对象
    EpollCallback _onCloseCb; // 回调函数，传递给TcpConnection对象
    //typedef function<void()> Functor; // 函数回调重定义
    vector<Functor> _pendingFunctions; // 需要延迟执行的回调函数
};

#endif